package cn.edu.lcu.cs.javaprogramming.collection;

import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.util.Iterator;
import java.util.List;

/**
 * Collection遍历演示
 * 
 * @author Ling
 *
 */
class TraversalDemo {
	List<Score> scores;

	@BeforeAll
	void beforeAll() {
		for (int i = 0; i < 10; i++) {
			String id = String.format("%02d", i);
			//scores.add(new Score("s" + id, "学生" + id, COURSE_NAME, randomScore(), randomScore(), randomScore(), randomScore()));
		}
	}




	/**
	 * 传统for循环遍历 
	 */
	@Test
	void traversalClassic() {
		System.out.println("------传统For循环遍历-------------------------------------");
		// 遍历打印成绩列表
		// list.get(i) list.size()
		// 传统的遍历
		for (int i = 0; i < scores.size(); i++) {
			Score score = scores.get(i);
			System.out.println(score);
		}
	}

	/**
	 * for-each遍历 
	 */
	@Test
	void traversalForEach() {
		System.out.println("------foreach遍历-------------------------------------");
	
		// JDK5？？ 增加的foreach语法，遍历容器和数组
		for (Score score : scores) {
			System.out.println(score);
			// foreach遍历，要求被遍历的容器或者数组内容不能变更
			// if (score.getScore() >= 60) {
			// scores.remove(score);
			// }
		}
	}

	/**
	 * 使用迭代器遍历 
	 */
	@Test
	void traversalIterator() {
		System.out.println("------迭代器遍历-------------------------------------");
		// 获取迭代器对象
		Iterator<Score> iterator = scores.iterator();
		// 使用迭代器进行迭代
		while (iterator.hasNext()) {
			Score score = (Score) iterator.next();
			System.out.println(score);
		}
	}

	/**
	 * JDK8 forEach()遍历 
	 */
	@Test
	void traversalJDK8ForEach() {
		System.out.println("------JDK8增加的forEach()遍历-------------------------------------");
		// 对容器进行遍历，每次提取一个元素，对这个元素进行某些操作
		// 所谓操作，就是调用一个函数
		// 这个函数可以作为一个对象传递给forEach()方法
		scores.forEach(System.out::println); // 方法引用
		// scores.forEach(score -> System.out.println(score)); // Lambda表达式
	}

}
